home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d20 / msgq160s.arc / EDITBUF.C < prev    next >
Text File  |  1991-10-26  |  2KB  |  87 lines

  1. /*
  2.  * EDITBUF.C - Message buffer manipulation
  3.  *
  4.  * Msged/Q message editor for QuickBBS  Copyright 1990 by P.J. Muller
  5.  *
  6.  */
  7.  
  8. #include <stdlib.h>
  9. #include <string.h>
  10.  
  11. #include "msged.h"
  12.  
  13. /*
  14.  * Insert a line before another one and return it
  15.  * if (cur == NULL) add line at end
  16.  * The buffer is empty iff (buf->first == NULL)
  17.  * Return NULL on error
  18.  */
  19.  
  20. LINE *insertline(BUFFER *buf, LINE *cur, char *txt)
  21. {
  22.   LINE *t;
  23.  
  24.   if (buf == NULL)
  25.     return NULL;
  26.  
  27.   if ((t = (LINE *) calloc(1,sizeof(LINE))) == NULL)    /* clear allocate */
  28.     return NULL;        /* all fields of *t was cleared */
  29.  
  30.   if (txt != NULL)
  31.     if ((t->text = strdup(txt)) == NULL)    /* the text of the line */
  32.       return NULL;
  33.  
  34.   t->next = cur;            /* create links */
  35.   if (cur != NULL) {
  36.     t->prev = cur->prev;
  37.     if (cur->prev != NULL)
  38.       cur->prev->next = t;
  39.     cur->prev = t;
  40.   } else {                /* add to end */
  41.     LINE *step;                /* this little hack is here to */
  42.     if ((buf->last == NULL) || (buf->last->next != NULL)) {
  43.       if ((step = buf->first) != NULL)    /*  make up for the rest of */
  44.     while (step->next != NULL)    /*  things which don't always */
  45.       step = step->next;        /*  update msgbuf.last */
  46.       buf->last = step;
  47.     } /* if */
  48.  
  49.     if ((step = buf->last) != NULL)
  50.       step->next = t;
  51.     t->prev = step;
  52.     buf->last = t;            /* new last line */
  53.   } /* else */
  54.  
  55.   if (buf->first == NULL) {        /* buffer was empty */
  56.     buf->first = t;
  57.     buf->last = t;
  58.   } else {
  59.     if (buf->first == cur)        /* current was first */
  60.       buf->first = t;            /* so new is now first */
  61.   } /* else */
  62.  
  63.   return(t);
  64. } /* insertline */
  65.  
  66. /*
  67.  * Delete the line 'cur'
  68.  */
  69.  
  70. void deleteline(BUFFER *buf, LINE *cur)
  71. {
  72.   if ((buf == NULL) || (cur == NULL)) return;
  73.  
  74.   if (buf->first == cur)        /* cur is first line */
  75.     buf->first = cur->next;
  76.   if (buf->last == cur)            /* cur is last line */
  77.     buf->last = cur->prev;
  78.  
  79.   if (cur->prev != NULL)
  80.     cur->prev->next = cur->next;
  81.   if (cur->next != NULL)
  82.     cur->next->prev = cur->prev;
  83.  
  84.   ptrfree(cur->text);
  85.   ptrfree(cur);
  86. } /* deleteline */
  87.